<?php
class lib_mail {
    //---设置全局变量
    var $mailTo = ""; // 收件人
    var $mailCC = ""; // 抄送
    var $mailBCC = ""; // 秘密抄送
    var $mailFrom = ""; // 发件人
    var $mailSubject = ""; // 主题
    var $mailText = ""; // 文本格式的信件主体
    var $mailHTML = ""; // html格式的信件主体
    var $mailAttachments = ""; // 附件

    function setTo($inAddress)
    {
        $addressArray = explode( ",",$inAddress);
        
        for($i=0;$i<count($addressArray);$i++)
        {
             if($this->checkEmail($addressArray[$i])==false)
                 return false; 
        }
        
        $this->mailTo = implode($addressArray, ",");
        return true;
    }

    function setCC($inAddress)
    {
       
        $addressArray = explode( ",",$inAddress);
        
        for($i=0;$i<count($addressArray);$i++)
        {
            if($this->checkEmail($addressArray[$i])==false)
                return false; 
        }
        
        $this->mailCC = implode($addressArray, ",");
        return true;
    }

    function setBCC($inAddress)
    {
       
        $addressArray = explode( ",",$inAddress);
        
        for($i=0;$i<count($addressArray);$i++)
        { if($this->checkEmail($addressArray[$i])==false)
        return false;
        }
        
        $this->mailBCC = implode($addressArray, ",");
        return true;
    }

    function setFrom($inAddress)
    {
        if($this->checkEmail($inAddress))
        {
            $this->mailFrom = $inAddress;
            return true;
        }
        return false; 
    }

    function setSubject($inSubject)
    {
        if(strlen(trim($inSubject)) > 0)
        {
            $this->mailSubject = str_replace( "\n" , "",$inSubject);
            $this->mailSubject = '=?gb2312?B?'.base64_encode($this->mailSubject).'?=';
            return true; 
        }
        return false; 
    }

    function setText($inText)
    {
        if(strlen(trim($inText)) > 0){
            $this->mailText = $inText;
            return true; 
        }
        return false;
    }

    function setHTML($inHTML)
    {
        if(strlen(trim($inHTML)) > 0){
            $this->mailHTML = base64_encode($inHTML);
            return true; 
        }
        return false; 
    }

    function setAttachments($inAttachments)
    {
        if(strlen(trim($inAttachments)) > 0){
            $this->mailAttachments = $inAttachments;
            return true; 
        }
        return false; 
    }

    function checkEmail($inAddress)
    {
        return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$",$inAddress));
    }

    function loadTemplate($inFileLocation,$inHash,$inFormat)
    {

        $templateDelim = "~";
        $templateNameStart = "!";
        //--找出这些地方并把他们替换掉
        $templateLineOut = ""; //--打开临时文件
        if($templateFile = fopen($inFileLocation, "r")){
            while(!feof($templateFile)){
                $templateLine = fgets($templateFile,1000);
                $templateLineArray = explode($templateDelim,$templateLine);
                for( $i=0; $i<count($templateLineArray);$i++){
                    //--寻找起始位置
                    if(strcspn($templateLineArray[$i],$templateNameStart)==0){
                        //--替换相应的值
                        $hashName = substr($templateLineArray[$i],1);
                        //--替换相应的值
                        $templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
                    }
                }
                //--输出字符数组并叠加
                $templateLineOut .= implode($templateLineArray, "");
            } //--关闭文件fclose($templateFile);
            //--设置主体格式(文本或html)
            if( strtoupper($inFormat)== "TEXT" )
            return($this->setText($templateLineOut));
            else if( strtoupper($inFormat)== "HTML" )
            return($this->setHTML($templateLineOut));
        } return false;
    }

    function getRandomBoundary($offset = 0)
    {
        //--随机数生成
        srand(time()+$offset);
        //--返回 md5 编码的32位 字符长度的字串
        return ( "----".(md5(rand()))); 
    }

    function getContentType($inFileName)
    {
        //--去除路径
        $inFileName = basename($inFileName);
        //--去除没有扩展名的文件
        if(strrchr($inFileName, ".") == false){
            return "application/octet-stream";
        }
        //--提区扩展名并进行判断
        $extension = strrchr($inFileName, ".");
        switch($extension){
            case ".gif": return "image/gif";
            case ".gz": return "application/x-gzip";
            case ".htm": return "text/html";
            case ".html": return "text/html";
            case ".jpg": return "image/jpeg";
            case ".tar": return "application/x-tar";
            case ".txt": return "text/plain";
            case ".zip": return "application/zip";
            default: return "application/octet-stream";
        }
        return "application/octet-stream";
    }

    function formatTextHeader()
    { 
        $outTextHeader = "";
        $outTextHeader .= "Content-Type: text/plain;"."\n"
                       ."charset=gb2312"."\n"
                       ."Content-Transfer-Encoding: base64"."\n"
                       .$this->mailText. "\n";
        return $outTextHeader;
    }

    function formatHTMLHeader(){
        $outHTMLHeader = "";
        $outHTMLHeader .= "Content-Type: text/html;"."\n"
                       ."charset=gb2312"."\n"
                       ."Content-Transfer-Encoding: base64"."\n".$this->mailHTML. "\n";
        return $outHTMLHeader;
    }

    function formatAttachmentHeader($inFileLocation)
    {
        $outAttachmentHeader = "";
        //--用上面的函数getContentType($inFileLocation)得出附件类型
        $contentType = $this->getContentType($inFileLocation);
        //--如果附件是文本型则用标准的7位编码
        if(ereg( "text",$contentType)){
            $outAttachmentHeader .= "Content-Type: ".$contentType. ";\n";
            $outAttachmentHeader .= 'name="'.basename($inFileLocation). '"'. "\n";
            $outAttachmentHeader .= "Content-Transfer-Encoding: 7bit\n";
            $outAttachmentHeader .= "Content-Disposition: attachment;\n";
            $outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "\n\n";
            $textFile = fopen($inFileLocation, "r");
            while(!feof($textFile)){
                $outAttachmentHeader .= fgets($textFile,1000);
            }
            //--关闭文件 fclose($textFile);
            $outAttachmentHeader .= "\n";
        }
        //--非文本格式则用64位进行编码
        else{ $outAttachmentHeader .= "Content-Type: ".$contentType. ";\n";
        $outAttachmentHeader .= ' name="'.basename($inFileLocation). '"'. "\n";
        $outAttachmentHeader .= "Content-Transfer-Encoding: base64\n";
        $outAttachmentHeader .= "Content-Disposition: attachment;\n";
        $outAttachmentHeader .= ' filename="'.basename($inFileLocation). '"'. "\n\n";
        //--调用外部命令uuencode进行编码
        exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
        for ($i = 1; $i<(count($returnArray)); $i++){
            $outAttachmentHeader .= $returnArray[$i]. "\n";
        }
        } return $outAttachmentHeader;
    }

    function send(){
        //--设置邮件头为空
        $mailHeader = "";
        //--添加抄送人
        if($this->mailCC != "")
        $mailHeader .= "CC: ".$this->mailCC. "\n";
        //--添加秘密抄送人
        if($this->mailBCC != "")
        $mailHeader .= "BCC: ".$this->mailBCC. "\n";
        //--添加发件人
        if($this->mailFrom != "")
        $mailHeader .= "FROM: ".$this->mailFrom. "\n";
        //---------------------------邮件格式------------------------------
        //--文本格式
        if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
            
            return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
        }
        //--html或text格式
        else if($this->mailText == "" && $this->mailHTML != "" && $this->mailAttachments == ""){
            $bodyBoundary = $this->getRandomBoundary();
            $textHeader = $this->formatTextHeader();
            $htmlHeader = $this->formatHTMLHeader();
            //--设置 MIME-版本
            $mailHeader .= "MIME-Version: 1.0\n";
            $mailHeader .= "Content-Type: multipart/alternative;\n";
            $mailHeader .= ' boundary="'.$bodyBoundary. '"';
            $mailHeader .= "\n\n\n";
            //--添加邮件主体和边界
            $mailHeader .= "--".$bodyBoundary. "\n";
            $mailHeader .= $textHeader;
            $mailHeader .= "--".$bodyBoundary. "\n";
            //--添加html标签
            $mailHeader .= $htmlHeader;
            $mailHeader .= "\n--".$bodyBoundary. "--";
            //--发送邮件
            var_dump($mailHeader);
            return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
        }
        //--文本加html加附件
        else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){

            $attachmentBoundary = $this->getRandomBoundary();
            $mailHeader .= "Content-Type: multipart/mixed;\n";
            $mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "\n\n";
            $mailHeader .= "This is a multi-part message in MIME format.\n";
            $mailHeader .= "--".$attachmentBoundary. "\n";
            $bodyBoundary = $this->getRandomBoundary(1);
            $textHeader = $this->formatTextHeader();
            $htmlHeader = $this->formatHTMLHeader();
            $mailHeader .= "MIME-Version: 1.0\n";
            $mailHeader .= "Content-Type: multipart/alternative;\n";
            $mailHeader .= ' boundary="'.$bodyBoundary. '"';
            $mailHeader .= "\n\n\n";
            $mailHeader .= "--".$bodyBoundary. "\n";
            $mailHeader .= $textHeader;
            $mailHeader .= "--".$bodyBoundary. "\n";
            $mailHeader .= $htmlHeader;
            $mailHeader .= "\n--".$bodyBoundary. "--";
            //--获取附件值
            $attachmentArray = explode( ",",$this->mailAttachments);
            //--根据附件的个数进行循环
            for($i=0;$i<count($attachmentArray);$i++){
                //--分割 $mailHeader .= "n--".$attachmentBoundary. "n";
                //--附件信息
                $mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
            }
            $mailHeader .= "--".$attachmentBoundary. "--";

            return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
        }
        return false;
    }
}

?>